﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bibilioteca.DataAccess;
using Bibilioteca.Models;
using System.Data;

namespace Bibilioteca.Dominio
{
    public class NegocioSocios
    {
        private SociosDao sociosDao;
        private NegocioCuentas cuentas;
        
        public NegocioSocios()
        {
            sociosDao = new SociosDao();
            cuentas = new NegocioCuentas();
        }

        /*
         * Genera a partir de un dataTable un LinkedList.
         * Esto es simplemente porque desde la vista no se puede iterar
         * sobre un datatable, se necesita una coleccion de socios.
         */
        private LinkedList<Socio> generarListaSocios(DataTable tabla)
        {
            LinkedList<Socio> retorno = new LinkedList<Socio>();
            foreach (DataRow row in tabla.Rows)
            {
                Cuenta c = cuentas.GetCuentaDeSocio(((int)row["socio_id"]).ToString() );
                Socio s = new Socio((int)row["socio_id"], (string)row["socio_nombre"], (string)row["socio_apellido"],
                            (string)row["socio_email"], (string)row["socio_domicilio"], (bool)row["socio_habilitado"], c);
                retorno.AddLast(s);
            }
            return retorno;
        }

        /*
         * Retorna una lista enlazada de todos los socios en la BD.
         */
        public LinkedList<Socio> todosLosSocios()
        {
            return generarListaSocios(sociosDao.todosLosSocios());
        }

        /*
         * Dado un numero de socio lo busca en la BD y lo retorna.
         */
        public Socio GetSocioNumero(string id)
        {
            sociosDao.paramID = Convert.ToInt32(id.Trim());
            DataTable socioTable = sociosDao.GetSocioNumero();
            foreach (DataRow row in socioTable.Rows)
            {
                Cuenta c = cuentas.GetCuentaDeSocio(((int)row["socio_id"]).ToString());
                Socio s = new Socio((int)row["socio_id"], (string)row["socio_nombre"], (string)row["socio_apellido"],
                            (string)row["socio_email"], (string)row["socio_domicilio"], (bool)row["socio_habilitado"], c);
                return s;
            }
            return new Socio(0, "No existe", "No existe", "No existe", "No existe");
        }


        /*
         * Dado un numero de socio lo busca en la BD y lo retorna.
         */
        public Socio GetSocioConUsername(string user)
        {
            Cuenta usuario = cuentas.GetCuentaDeUsuario(user);
            if (usuario.Id <= 0)
                return new Socio(0, "No existe", "No existe", "No existe", "No existe");

            return GetSocioNumero(usuario.socioId.ToString());
        }


        public void modificarSocio(Socio socio)
        {
            sociosDao.paramID = socio.Id;
            sociosDao.nombre = socio.Nombre;
            sociosDao.apellido = socio.Apellido;
            sociosDao.domicilio = socio.Domicilio;
            sociosDao.mail = socio.Email;
            sociosDao.habilitado = socio.Habilitado == true ? 1 : 0;

            if(socio != null && socio.Id != 0)
                sociosDao.modificarSocio();
        }

        public void insertarSocio(Socio socio)
        {
            sociosDao.nombre = socio.Nombre;
            sociosDao.apellido = socio.Apellido;
            sociosDao.domicilio = socio.Domicilio;
            sociosDao.mail = socio.Email;
            sociosDao.habilitado = 1;

            sociosDao.insertarSocio();
        }

        public void eliminarSocio(int id)
        {
            sociosDao.paramID = id;
            if (id != 0)
                sociosDao.eliminarSocio();
        }

        /*
         * Se deshabilita el socio y su cuenta.
         */
        public void deshabilitarSocio(int id)
        {
            if (id != 0)
            {
                //Primero obtengo la cuenta del socio, si es que tiene
                Socio s = GetSocioNumero(id.ToString());
                int idDeCuenta = 0;
                if (s.cuenta != null)
                    idDeCuenta = s.cuenta.Id;

                sociosDao.paramID = id;
                sociosDao.habilitado = 0;
                sociosDao.modificarSocio();
                cuentas.deshabilitarCuenta(idDeCuenta);
            }
        }

        public void habilitarSocio(int id)
        {
            if (id != 0)
            {
                //Primero obtengo la cuenta del socio, si es que tiene
                Socio s = GetSocioNumero(id.ToString());
                int idDeCuenta = 0;
                if (s.cuenta != null)
                    idDeCuenta = s.cuenta.Id;

                sociosDao.paramID = id;
                sociosDao.habilitado = 1;
                sociosDao.modificarSocio();
                cuentas.habilitarCuenta(idDeCuenta);
            }
        }


    }
}